home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / src / tutorials / custEducation / opengl2 / librgb / rgbReadImageFile.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-02  |  7.8 KB  |  252 lines

  1. /*
  2.  * Copyright 1993, 1994, Silicon Graphics, Inc.
  3.  * All Rights Reserved.
  4.  *
  5.  * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
  6.  * the contents of this file may not be disclosed to third parties, copied or
  7.  * duplicated in any form, in whole or in part, without the prior written
  8.  * permission of Silicon Graphics, Inc.
  9.  *
  10.  * RESTRICTED RIGHTS LEGEND:
  11.  * Use, duplication or disclosure by the Government is subject to restrictions
  12.  * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
  13.  * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
  14.  * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
  15.  * rights reserved under the Copyright Laws of the United States.
  16.  */
  17.  
  18. #include <gl/image.h>
  19. #include "rgbImageFile.h"
  20.  
  21. /*
  22.  *    private function prototypes
  23.  *
  24.  */
  25.  
  26. void bwtorgba( register unsigned short *b, register unsigned int *l, 
  27.     register int n, float alpha );
  28. void rgbtorgba( register unsigned short *r, register unsigned short *g, 
  29.     register unsigned short *b, register unsigned int *l, 
  30.     register int n, float alpha );
  31. void rgbtorgba( register unsigned short *r, register unsigned short *g, 
  32.     register unsigned short *b, register unsigned int *l, 
  33.     register int n, float alpha );
  34. void rgbatorgba( register unsigned short *r, register unsigned short *g, 
  35.     register unsigned short *b, register unsigned short *a, 
  36.     register unsigned int *l, register int n, float alpha );
  37.  
  38. unsigned int *rgbReadImageFile( char *name, int *width, int *height )
  39. {
  40.     unsigned int *base, *lptr;
  41.     unsigned short *rbuf, *gbuf, *bbuf, *abuf;
  42.     IMAGE *image;
  43.     int y;
  44.  
  45.     /* This program and librgbImageFile both rely on an unsigned
  46.      * int being 4 unsigned contiguous bytes.  The following test 
  47.      * checks to see if this is the case. 
  48.      */
  49.     if ( sizeof( unsigned int ) != 4  )
  50.     {
  51.         fprintf (stderr, "Warning: sizeof( unsigned int ) != 4,\
  52.             this program and librgbImageFile must be modified\n"
  53.             );
  54.  
  55.         exit (1);
  56.     }
  57.  
  58.     image = iopen(name,"r");
  59.     if(!image) {
  60.     fprintf(stderr,"rgbImageFileRead: can't open image file %s\n",name);
  61.     exit(1);
  62.     }
  63.     *width = image->xsize;
  64.     *height = image->ysize;
  65.     base = (unsigned int *)malloc(image->xsize*image->ysize*sizeof(unsigned int));
  66.     rbuf = (unsigned short *)malloc(image->xsize*sizeof(short));
  67.     gbuf = (unsigned short *)malloc(image->xsize*sizeof(short));
  68.     bbuf = (unsigned short *)malloc(image->xsize*sizeof(short));
  69.     abuf = (unsigned short *)malloc(image->xsize*sizeof(short));
  70.     if(!base || !rbuf || !gbuf || !bbuf) {
  71.     fprintf(stderr,"rgbImageFileRead: can't malloc enough memory\n");
  72.     exit(1);
  73.     }
  74.     lptr = base;
  75.     for(y=0; y<image->ysize; y++) {
  76.     if(image->zsize>=4) {
  77.         getrow(image,rbuf,y,0);
  78.         getrow(image,gbuf,y,1);
  79.         getrow(image,bbuf,y,2);
  80.         getrow(image,abuf,y,3);
  81.         rgbatorgba(rbuf,gbuf,bbuf,abuf,lptr,image->xsize, 1.0);
  82.         lptr += image->xsize;
  83.     } else if(image->zsize==3) {
  84.         getrow(image,rbuf,y,0);
  85.         getrow(image,gbuf,y,1);
  86.         getrow(image,bbuf,y,2);
  87.         rgbtorgba(rbuf,gbuf,bbuf,lptr,image->xsize, 1.0);
  88.         lptr += image->xsize;
  89.     } else {
  90.         getrow(image,rbuf,y,0);
  91.         bwtorgba(rbuf,lptr,image->xsize, 1.0);
  92.         lptr += image->xsize;
  93.     }
  94.     }
  95.     iclose(image);
  96.     free(rbuf);
  97.     free(gbuf);
  98.     free(bbuf);
  99.     free(abuf);
  100.     return base;
  101. }
  102.  
  103. unsigned int *rgbReadImageFileAlpha( char *name, int *width, int *height,
  104. float alpha)
  105. {
  106.     unsigned int *base, *lptr;
  107.     unsigned short *rbuf, *gbuf, *bbuf, *abuf;
  108.     IMAGE *image;
  109.     int y;
  110.  
  111.     /* This program and librgbImageFile both rely on an unsigned
  112.      * int being 4 unsigned contiguous bytes.  The following test 
  113.      * checks to see if this is the case. 
  114.      */
  115.     if ( sizeof( unsigned int ) != 4  )
  116.     {
  117.         fprintf (stderr, "Warning: sizeof( unsigned int ) != 4,\
  118.             this program and librgbImageFile must be modified\n"
  119.             );
  120.  
  121.         exit (1);
  122.     }
  123.  
  124.     image = iopen(name,"r");
  125.     if(!image) {
  126.     fprintf(stderr,"rgbImageFileRead: can't open image file %s\n",name);
  127.     exit(1);
  128.     }
  129.     *width = image->xsize;
  130.     *height = image->ysize;
  131.     base = (unsigned int *)malloc(image->xsize*image->ysize*sizeof(unsigned int));
  132.     rbuf = (unsigned short *)malloc(image->xsize*sizeof(short));
  133.     gbuf = (unsigned short *)malloc(image->xsize*sizeof(short));
  134.     bbuf = (unsigned short *)malloc(image->xsize*sizeof(short));
  135.     abuf = (unsigned short *)malloc(image->xsize*sizeof(short));
  136.     if(!base || !rbuf || !gbuf || !bbuf) {
  137.     fprintf(stderr,"rgbImageFileRead: can't malloc enough memory\n");
  138.     exit(1);
  139.     }
  140.     lptr = base;
  141.     for(y=0; y<image->ysize; y++) {
  142.     if(image->zsize>=4) {
  143.         getrow(image,rbuf,y,0);
  144.         getrow(image,gbuf,y,1);
  145.         getrow(image,bbuf,y,2);
  146.         getrow(image,abuf,y,3);
  147.         rgbatorgba(rbuf,gbuf,bbuf,abuf,lptr,image->xsize, alpha);
  148.         lptr += image->xsize;
  149.     } else if(image->zsize==3) {
  150.         getrow(image,rbuf,y,0);
  151.         getrow(image,gbuf,y,1);
  152.         getrow(image,bbuf,y,2);
  153.         rgbtorgba(rbuf,gbuf,bbuf,lptr,image->xsize, alpha);
  154.         lptr += image->xsize;
  155.     } else {
  156.         getrow(image,rbuf,y,0);
  157.         bwtorgba(rbuf,lptr,image->xsize, alpha);
  158.         lptr += image->xsize;
  159.     }
  160.     }
  161.     iclose(image);
  162.     free(rbuf);
  163.     free(gbuf);
  164.     free(bbuf);
  165.     free(abuf);
  166.     return base;
  167. }
  168.  
  169. void
  170. bwtorgba( register unsigned short *b, register unsigned int *l, 
  171.     register int n, float alpha )
  172. {
  173.     register unsigned short scaledAlpha;
  174.  
  175.     scaledAlpha = (unsigned short) (alpha * 0xFF);
  176.     /* added FF for alpha so transparent textures will work - mars */
  177.     while(n>=8) {
  178.     l[0] = scaledAlpha | 0x01010100*b[0];
  179.     l[1] = scaledAlpha | 0x01010100*b[1];
  180.     l[2] = scaledAlpha | 0x01010100*b[2];
  181.     l[3] = scaledAlpha | 0x01010100*b[3];
  182.     l[4] = scaledAlpha | 0x01010100*b[4];
  183.     l[5] = scaledAlpha | 0x01010100*b[5];
  184.     l[6] = scaledAlpha | 0x01010100*b[6];
  185.     l[7] = scaledAlpha | 0x01010100*b[7];
  186.     l += 8;
  187.     b += 8;
  188.     n -= 8;
  189.     }
  190.     while(n--) 
  191.     *l++ = scaledAlpha | 0x01010100*(*b++);
  192. }
  193.  
  194. void
  195. rgbtorgba( register unsigned short *r, register unsigned short *g, 
  196.     register unsigned short *b, register unsigned int *l, 
  197.     register int n, float alpha)
  198. {
  199.     register unsigned short scaledAlpha;
  200.  
  201.     scaledAlpha = (unsigned short) (alpha * 0xFF);
  202.  
  203.     /* added FF for alpha so transparent textures will work - mars */
  204.     while(n>=8) {
  205.     l[0] = scaledAlpha | (b[0]<<8) | (g[0]<<16) | (r[0]<<24);
  206.     l[1] = scaledAlpha | (b[1]<<8) | (g[1]<<16) | (r[1]<<24);
  207.     l[2] = scaledAlpha | (b[2]<<8) | (g[2]<<16) | (r[2]<<24);
  208.     l[3] = scaledAlpha | (b[3]<<8) | (g[3]<<16) | (r[3]<<24);
  209.     l[4] = scaledAlpha | (b[4]<<8) | (g[4]<<16) | (r[4]<<24);
  210.     l[5] = scaledAlpha | (b[5]<<8) | (g[5]<<16) | (r[5]<<24);
  211.     l[6] = scaledAlpha | (b[6]<<8) | (g[6]<<16) | (r[6]<<24);
  212.     l[7] = scaledAlpha | (b[7]<<8) | (g[7]<<16) | (r[7]<<24);
  213.     l += 8;
  214.     r += 8;
  215.     g += 8;
  216.     b += 8;
  217.     n -= 8;
  218.     }
  219.     while(n--) 
  220.         *l++ = scaledAlpha | ((*b++)<<8) | ((*g++)<<16) | ((*r++)<<24);
  221. }
  222.  
  223. void
  224. rgbatorgba( register unsigned short *r, register unsigned short *g, 
  225.     register unsigned short *b, register unsigned short *a, 
  226.     register unsigned int *l, register int n , float alpha)
  227. {
  228.     register unsigned short scaledAlpha;
  229.  
  230.     scaledAlpha =  (alpha * 0xFF);
  231.  
  232.     while(n>=8) {
  233.     l[0] = (unsigned short)(alpha * a[0]) | (b[0]<<8) | (g[0]<<16) | (r[0]<<24);
  234.     l[1] = (unsigned short)(alpha * a[1]) | (b[1]<<8) | (g[1]<<16) | (r[1]<<24);
  235.     l[2] = (unsigned short)(alpha * a[2]) | (b[2]<<8) | (g[2]<<16) | (r[2]<<24);
  236.     l[3] = (unsigned short)(alpha * a[3]) | (b[3]<<8) | (g[3]<<16) | (r[3]<<24);
  237.     l[4] = (unsigned short)(alpha * a[4]) | (b[4]<<8) | (g[4]<<16) | (r[4]<<24);
  238.     l[5] = (unsigned short)(alpha * a[5]) | (b[5]<<8) | (g[5]<<16) | (r[5]<<24);
  239.     l[6] = (unsigned short)(alpha * a[6]) | (b[6]<<8) | (g[6]<<16) | (r[6]<<24);
  240.     l[7] = (unsigned short)(alpha * a[7]) | (b[7]<<8) | (g[7]<<16) | (r[7]<<24);
  241.     l += 8;
  242.     r += 8;
  243.     g += 8;
  244.     b += 8;
  245.     a += 8;
  246.     n -= 8;
  247.     }
  248.     while(n--) 
  249.         *l++ = ((unsigned short)(alpha * (*a++))) | ((*b++)<<8) | ((*g++)<<16) | ((*r++)<<24);
  250. }
  251.  
  252.